<?php

namespace App\Services;

use Log;

class CommandService {
    
    public function sendCmd($f, $c) {
        // $cmdArr = [
        //     "1_1"=>"\x55\x01\x12\x00\x00\x00\x01\x69",
        //     "0_1"=>"\x55\x01\x11\x00\x00\x00\x01\x68",
        //     "1_2"=>"\x55\x01\x12\x00\x00\x00\x02\x6A",
        //     "0_2"=>"\x55\x01\x11\x00\x00\x00\x02\x69",
        //     "1_3"=>"\x55\x01\x12\x00\x00\x00\x03\x6B",
        //     "0_3"=>"\x55\x01\x11\x00\x00\x00\x03\x6A",
        //     "1_4"=>"\x55\x01\x12\x00\x00\x00\x04\x6C",
        //     "0_4"=>"\x55\x01\x11\x00\x00\x00\x04\x6B",
        //     "1_5"=>"\x55\x01\x12\x00\x00\x00\x05\x6D",
        //     "0_5"=>"\x55\x01\x11\x00\x00\x00\x05\x6C",
        //     "1_6"=>"\x55\x01\x12\x00\x00\x00\x06\x6E",
        //     "0_6"=>"\x55\x01\x11\x00\x00\x00\x06\x6D",
        //     "1_7"=>"\x55\x01\x12\x00\x00\x00\x07\x6F",
        //     "0_7"=>"\x55\x01\x11\x00\x00\x00\x07\x6E",
        //     "1_8"=>"\x55\x01\x12\x00\x00\x00\x08\x70",
        //     "0_8"=>"\x55\x01\x11\x00\x00\x00\x08\x6F",
        //     "1_9"=>"\x55\x01\x12\x00\x00\x00\x09\x71",
        //     "0_9"=>"\x55\x01\x11\x00\x00\x00\x09\x70",
        //     "1_10"=>"\x55\x01\x12\x00\x00\x00\x0A\x72",
        //     "0_10"=>"\x55\x01\x11\x00\x00\x00\x0A\x71",

        //     "1_11"=>"\x55\x01\x12\x00\x00\x00\x0B\x73",
        //     "0_11"=>"\x55\x01\x11\x00\x00\x00\x0B\x72",
        //     "1_12"=>"\x55\x01\x12\x00\x00\x00\x0C\x74",
        //     "0_12"=>"\x55\x01\x11\x00\x00\x00\x0C\x73",
        //     "1_13"=>"\x55\x01\x12\x00\x00\x00\x0D\x74",
        //     "0_13"=>"\x55\x01\x11\x00\x00\x00\x0D\x73",

        // ];
        // $sendBuf = $cmdArr[$k];
        $end = hexdec('55') + hexdec('01') + hexdec($f) + hexdec($c);

        // $sendBuf = hex2bin('5501'.$f.'000000'.$c.$end);
        $sendBuf = hex2bin('5501'.$f.'000000'.$c.dechex($end));

        // $sendBuf = "\x55\x01\x12\x00\x00\x00\x01\x69"; //open 1way
        // $sendBuf = "\x55\x01\x11\x00\x00\x00\x01\x68"; //close 1way

        //$sendBuf = "\x55\x01\x12\x00\x00\x00\x02\x6A"; //open 2way
        //$sendBuf = "\x55\x01\x11\x00\x00\x00\x01\x68"; //close 2way
        //$sendBuf = "\x55\x01\x11\x00\x00\x00\x02\x69"; //close 2way
        //$sendBuf = "\x55\x01\x13\x00\x00\x00\x03\x6C"; //打开1、2路，关闭其他
        // $sendBuf = "\x55\x01\x13\xFF\xFF\xFF\xFF\x65"; //关闭所有55 01 13 FF FF FF FF 65
        // $sendBuf = "\x55\x01\x13\x00\x00\x00\x00\x69"; //关闭所有
        return $this->doSend($sendBuf);
    }

    public function controlAll($f) {
        if($f == '11') {
            return $this->doSend("\x55\x01\x13\x00\x00\x00\x00\x69");
        } else {
            // return $this->doSend("\x55\x01\x13\xFF\xFF\xFF\xFF\x65");
            return '';
        }
    }
    

    public function doSend($sendBuf) {
        $msg = '';
        /*
        Copyright@www.lt-gk.com
        使用说明，由于发送的是二进制字符串，所有构造buf的时候需要注意格式
        下面给出的是基于ip和域名的连接示例！具体其他协议，请参考“通信协议介绍的pdf文档”
        */

        $port = 3000;
        // $ip = "192.168.1.80";//修改为您板卡ip或花生壳域名
        $ip = env('SOCKET_IP');

        set_time_limit(5);
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($socket < 0) {
            log::info("socket_create() failed: reason: " . socket_strerror($socket) . "\n");
        }else {
            log::info("Create OK.<br>");
        }

        log::info( "试图连接 '$ip' 端口 '$port'...\n");
        $result = socket_connect($socket, $ip, $port);
        if ($result < 0) {
            log::info("socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n");
        }else {
            log::info("连接OK<br>");
        }

        if(!socket_write($socket, $sendBuf, 8)) {
            log::info("socket_write() failed: reason: " . socket_strerror($socket) . "\n");
        }else {
            $sendStr = bin2hex($sendBuf);
            log::info("发送到服务器信息成功!");
            log::info("发送的内容为:<font color='red'>$sendStr</font> <br>");
        }

        while($out = socket_read($socket, 8192)) {
            log::info("接收服务器回传信息成功！");
            $recvStr = bin2hex($out);
            log::info("接收的内容为:<font color='red'>$recvStr</font> <br>");
            $msg = $recvStr;
            break;
        }

        log::info("关闭SOCKET...<br>");
        socket_close($socket);
        log::info("关闭OK<br>");
        return $msg;
    }

    // public function shutdownHost($sys, $ip, $c) {
    //     $_cmd = '';
    //     if($sys == 'win') {
    //         $_cmd = sprintf($c, $ip);
    //     } else {
    //         $_cmd = '';
    //     }
    //     // exec("mkdir d:\\test", $out);
    //     return $_cmd;
    // }
}